package base.thread_demo.demo08_07;

/**
 * 从内部类不能直接在static main()方法中直接创建,通过提取成一个外部类方法并在该方法中直接创建内部类实例,
 * 这种现象折射出隐含的一个现象:非static方法一定属于对象.
 */
public class InnerClassDemo {

    // Outputer outputer = new Outputer(); // 外部类也可以直接new一个内部类实例.

    public static void main(String[] args) {
//        Outputer outputer = new Outputer();// 不可以的
//        new InnerClassDemo().new Outputer();// 可以的

            new InnerClassDemo().init();
    }

    /**
     * init()方法必属于 InnerClassDemo 类的实例对象
     *
     */
    public void init(){
        /**
         * Outputer 属于内部类，因内部类特点：能访问外部类属性，外部类属性属于实例，因此如果不存在外部类实例时，是不能够
         * 创建内部类实例，故如果这里init()的逻辑放到main()方法中，下面这句实例化内部类对象是会出错的。
         */
        Outputer outputer = new Outputer();// 不能直接在main()方法中new Outputer()
        new Thread(()->{
            while (true){
                outputer.output("zhangxiaoxiang");
            }
        },"t1").start();

        new Thread(()->{
            while (true){
                outputer.output("nihuoming");
            }
        },"t2").start();
    }


    class Outputer{
        public void output(String name){
            for (int i = 0; i < name.length(); i++) {
                System.out.print(name.charAt(i));
            }
            System.out.println();
        }
    }
}
